/**
 * @constructor user controller
 * @author captern
 */
const { getUserInfo, createUser, deleteUser, updateUser } = require('../services/user')
const { SuccessModel, ErrorModel } = require('../model/ResModel')
const { registerUserNameNotExistInfo, registerUserNameExistInfo, registerFailInfo, loginFailInfo, deleteUserFailInfo, changeInfoFailInfo, changePasswordFailInfo } = require('../model/ErrorInfo')
const doCrypto = require('../utils/cryp')
/**
 * 用户名是否存在
 * @param {string} userName 用户名
 * @returns {Promise<void>}
 */
async function isExist(userName) {
  // 业务逻辑处理
  // 调用 services 获取数据
  // 统一返回格式
  const userInfo = await getUserInfo(userName)
  if(userInfo) { // 用户名已经存在
    // { errno: 0, data: {....}}
    return new SuccessModel(userInfo)
  }else { // 不存在
    // { errno: 10003, message: '用户名未存在'}
    return new ErrorModel(registerUserNameNotExistInfo)
  }
}

/**
 * 注册方法
 * @param {string} userName 用户名
 * @param {string} password 密码
 * @param {number} gender 性别 （1 男， 2 女， 3 保密）
 * @returns {Promise<void>}
 */
async function register({userName, password, gender}) {
  const userInfo = await getUserInfo(userName)
  if(userInfo) {
    // 用户名已存在
    return new ErrorModel(registerUserNameExistInfo)
  }
  try {
    await createUser({
      userName,
      password: doCrypto(password),
      gender
    })
    return new SuccessModel()
  }catch (e) {
    console.error(e.message, e.stack)
    return new ErrorModel(registerFailInfo)
  }
}

/**
 * 登录
 * @param {Object} ctx koa2 ctx
 * @param {string} userName 用户名
 * @param {string} password 用户密码
 * @returns {Promise<void>}
 */
async function login(ctx, userName, password) { // ctx 登陆成功，ctx.session.userInfo = xxx 存储起来
  // 获取用户信息
  const userInfo = await getUserInfo(userName, doCrypto(password))
  if(!userInfo) { // 登录失败
    return new ErrorModel(loginFailInfo)
  }
  // 登录成功
  if(ctx.session.userInfo == null) {
    ctx.session.userInfo = userInfo
  }
  return new SuccessModel()
}

/**
 * 删除当前用户
 * @param {string} userName 用户名
 * @returns {Promise<void>}
 */
async function deleteCurUser(userName) {
  // service
  const result = await deleteUser(userName)
  if(result) { // 删除成功
    return new SuccessModel()
  }
  return new ErrorModel(deleteUserFailInfo)
}

/**
 * 修改个人信息
 * @param {Object} ctx
 * @param {string} nickName
 * @param {string} city
 * @param {string} picture
 * @returns {Promise<void>}
 */
async function changeInfo(ctx, {nickName, city, picture}){
  const {userName} = ctx.session.userInfo
  if(!nickName) {
    nickName = userName
  }

  // 修改用户
  const result = await updateUser(
    {
      newNickName: nickName,
      newCity: city,
      newPicture: picture
    },
    {userName}
  )

  if(result) { // 执行成功
    Object.assign(ctx.session.userInfo, {
      nickName,
      city,
      picture
    })
    return new SuccessModel()
  }
  return new ErrorModel(changeInfoFailInfo)
}

/**
 * 修改密码
 * @param {string} userName
 * @param {string} password
 * @param {string} newPassword
 * @returns {Promise<void>}
 */
async function changePassword({userName, password, newPassword}) {
  const result = await updateUser(
    {
      newPassword: doCrypto(newPassword)
    },
    {
      userName,
      password: doCrypto(password)
    }
  )
  if(result) { // 成功
    return new SuccessModel()
  }
  return new ErrorModel(changePasswordFailInfo)
}

/**
 * 退出登录
 * @param {Object} ctx
 * @returns {Promise<SuccessModel|*>}
 */
async function logout(ctx) {
  delete ctx.session.userInfo
  return new SuccessModel()
}

module.exports = {
  isExist,
  register,
  login,
  deleteCurUser,
  changeInfo,
  changePassword,
  logout
}
